package gui.panel;

import gui.Konstanten;

import java.awt.Dimension;
import java.awt.GridLayout;
import java.util.Observable;
import java.util.Observer;

import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

import steuerung.Controller;
import steuerung.data.Lieferung;

/**
 * Das BuchungsdetailsPanel zeigt alle Buchungen einer Lieferung in einer
 * Tabelle an
 * 
 * @author Wayne Fox
 */
public class BuchungsdetailsPanel extends JPanel implements Observer {

	private static final long serialVersionUID = -5456141389343674969L;

	private JLabel lbLieferdetailsLfNr;
	private JLabel lbLieferdetailsMenge;
	private JTable tbLieferdetails;

	/**
	 * Legt ein neues BuchungsDetailsPanel an
	 */
	public BuchungsdetailsPanel() {
		initialisieren();

		Controller.getInstance().addModelObserver(this);
	}

	@Override
	public void update(Observable o, Object arg1) {
		Lieferung ausgewaehlteLieferung = Controller.getInstance()
				.getAusgewaehlteLieferung();

		if (ausgewaehlteLieferung != null) {
			setzeLieferdetailsLiefernummer(ausgewaehlteLieferung.getLfnr());
			setzeLiefermenge(ausgewaehlteLieferung.getMenge());
			initialisiereLieferdetailsTableInhalt(Controller.getInstance()
					.getBuchungenAsArray(ausgewaehlteLieferung));
		}
	}

	private void initialisieren() {
		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

		this.setMinimumSize(new Dimension(Konstanten.TABBEDPANE_RECHTS_BREITE,
				Konstanten.TABBEDPANE_RECHTS_HOEHE));
		this.setMaximumSize(new Dimension(Konstanten.TABBEDPANE_RECHTS_BREITE,
				Konstanten.TABBEDPANE_RECHTS_HOEHE));

		// -------------------------------
		JPanel ldTopPanel = new JPanel(new GridLayout(2, 2, 0, 10));
		ldTopPanel.setMinimumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 60));
		ldTopPanel.setMaximumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 60));

		lbLieferdetailsLfNr = new JLabel(
				Konstanten.LIEFERDETAILS_LABEL_LFNR_UNBEKANNT);
		lbLieferdetailsLfNr.setHorizontalAlignment(JLabel.RIGHT);

		lbLieferdetailsMenge = new JLabel("-");
		lbLieferdetailsMenge.setHorizontalAlignment(JLabel.RIGHT);

		ldTopPanel.add(new JLabel(Konstanten.LIEFERDETAILS_LABEL_LFNR));
		ldTopPanel.add(lbLieferdetailsLfNr);

		ldTopPanel.add(new JLabel(Konstanten.LIEFERDETAILS_LABEL_BESTAND));
		ldTopPanel.add(lbLieferdetailsMenge);
		// -------------------------------
		JPanel ldMidPanel = new JPanel(new GridLayout(1, 1));
		ldMidPanel.setMinimumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 50));
		ldMidPanel.setMaximumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 50));

		JLabel lbLieferdetailsTableBeschriftung = new JLabel(
				Konstanten.LIEFERDETAILS_TABLE_TITEL);
		lbLieferdetailsTableBeschriftung.setVerticalAlignment(JLabel.BOTTOM);
		ldMidPanel.add(lbLieferdetailsTableBeschriftung);
		// -------------------------------
		JPanel ldBotPanel = new JPanel(new GridLayout(1, 1));

		ldBotPanel.setMinimumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 120));
		ldBotPanel.setMaximumSize(new Dimension(
				Konstanten.TABBEDPANE_RECHTS_BREITE - 20, 120));

		tbLieferdetails = new JTable(new DefaultTableModel(
				Konstanten.LIEFERDETAILS_TABLE_BESCHRIFTUNG, 0));
		tbLieferdetails.setEnabled(false);
		tbLieferdetails.setDefaultRenderer(Object.class,
				new DefaultTableCellRenderer() {

					private static final long serialVersionUID = 2351798808969363439L;

					@Override
					public int getHorizontalAlignment() {
						return JLabel.CENTER;
					}

				});

		JScrollPane spTableLieferung = new JScrollPane(tbLieferdetails);

		ldBotPanel.add(spTableLieferung);
		// -------------------------------

		this.add(ldTopPanel);
		this.add(ldMidPanel);
		this.add(ldBotPanel);
	}

	private void setzeLieferdetailsLiefernummer(String lfnr) {
		if (lfnr == null || lfnr.equals("0")) {
			lbLieferdetailsLfNr
					.setText(Konstanten.LIEFERDETAILS_LABEL_LFNR_UNBEKANNT);
		} else {
			lbLieferdetailsLfNr.setText(lfnr);
		}
	}

	private void initialisiereLieferdetailsTableInhalt(Object[][] inhalt) {
		tbLieferdetails.setModel(new DefaultTableModel(inhalt,
				Konstanten.LIEFERDETAILS_TABLE_BESCHRIFTUNG));
	}

	private void setzeLiefermenge(int menge) {
		if (menge == 0) {
			lbLieferdetailsMenge.setText("-");
		} else {
			lbLieferdetailsMenge.setText("" + menge);
		}
	}
}